最后编辑于: 2022-09-13 15:35 | 分类: 电子 | 标签: FPGA verilog | 浏览数: 2914 | 评论数: 0
位截取经常用到, 我们一般是使用诸如vt[7:2]
这样的形式, 位边界都是常量.
如果想要位边界是变量 以实现动态截取呢, 如果我们这样写 vt[cnt+4:cnt]
(cnt是变量), 是编译通不过的.
正确的语法应该这样写:
vt[base+:width] or vt[base-:width]
其中, base可以是变量, width必须是常量.
也即是说, 起始位可以是变量, 位宽必须是常量.
这样上面想当然的错误写法, 可以写为vt[cnt+:4]
.
if cnt=5, vt[cnt+:4]
等于 vt[8:5]
; vt[cnt-:4]
等于 vt[5:2]
.
不知为何, 这个用法应该是挺常用的, 但在很多verilog教材中都没有提及, 但在verilog标准中是有的哦.
大括号{}的拼接功能, 大家都知道了, 比如下面这种
{a, b[3:0], c, 3'b100}
就不多说了.
{{}}
表示复制, 这个用法就不常用了, 但有些场景用起来还是挺方便的.
比如: {4{a}}
等同于{a,a,a,a}
, {12{1'b1}}
等同于12'b1111_1111_1111
当然, 拼接 和 复制 也可以组合起来使用, 比如:
{a, {3{a,b}}}